<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>补码</title>
</head>
<body>
<script type="application/javascript">
    // 只有有符号数才存在正负数之分
    // 1011, 1111 负数
    // 0011, 1111 正数

    // 补码计算方式
    /**
     * ===============
     0000, 0001   1
     1000, 0001   -1
     计算1 -1的值

     1.计算1000, 0001的补码
     1.1取反：0111,1110
     1.2加1：0111,1111

     计算
     0111, 1111
     0000, 0001
     1000,0000
     结果 0
     ===============
     */
    // 补码的作用，补码是为了计算减法的时候，不需要再次设计减法逻辑单元，只需要转换成补码
    // 那么计算减法与计算加法是一致的

    // 我们这里按照8位来计算的
    function add (addOption, resStr) {
      if (addOption.add.length > 0) {
        let addStr = addOption.add[0]
        let byAddStr = addOption.byAdd[0]

        let res = null
        if (addStr === '1' && byAddStr === '1') {
          if (addOption.append === '1') {
            res = '1'
          } else {
            addOption.append = '1'
            res = '0'
          }
          addOption.append = '1'
        } else if (addStr === '1' && byAddStr === '0') {
          if (addOption.append === '1') {
            addOption.append = '1'
            res = '0'
          } else {
            addOption.append = '0'
            res = '1'
          }
        } else if (addStr === '0' && byAddStr === '1') {
          if (addOption.append === '1') {
            addOption.append = '1'
            res = '0'
          } else {
            addOption.append = '0'
            res = '1'
          }
        } else if (addStr === '0' && byAddStr === '0') {
          if (addOption.append === '1') {
            res = '1'
          } else {
            res = '0'
          }
          addOption.append = '0'
        }
        addOption.add.splice(0, 1)
        addOption.byAdd.splice(0, 1)
        return add(addOption, res + resStr)
      } else {
        return addOption.append + resStr
      }
    }
    function buMa (codeStr) {
      let codeArray = codeStr.split('')
      // 取反
      codeArray = codeArray.map(item => {
        if (item === '1') return '0'
        else return '1'
      }).reverse()
      // 加1，加法操作我们可以构建出一个8位数的二进制，并与数进行加法操作
      let addArray = '00000001'.split('').reverse()
      let res = add({
        add: codeArray,
        byAdd: addArray,
        append: '0'
      }, '').split('')
      if (res.length > 8) res.shift()
      return res.join('')
    }
    console.log(buMa('10000010'))
</script>
</body>
</html>
